package com.wrial.kind.dp;
/*
 * @Author  Wrial
 * @Date Created in 23:32 2020/8/14
 * @Description 把数字翻译成字符串
 * 给定一个数字，我们按照如下规则把它翻译为字符串：0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。
 * 一个数字可能有多个翻译。请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。
 */

public class TranslateNum {
    /**
     * 使用dp  dp[i]代表当i的最大不同解法
     *
     * dp[i] = dp[i-1]
     * if(i-1和i组成的数字>=10 <=25) dp[i] = dp[i-1]+dp[i-2](i-2>=0)  dp[i]+1(i-2<0)
     *
     * 优化：可以看到dp数组每次只会用到三个  dp[i] dp[i-1] dp[i-2] 每次循环更新可得空间上的优化O(n)->O(1)
     */
    public int translateNum(int num) {
        String str = String.valueOf(num);
        int[] dp = new int[str.length()];
        dp[0] = 1;
        for (int i = 1; i < str.length(); i++) {
            dp[i] = dp[i - 1];
            int integer = 10 * (str.charAt(i - 1) - '0') + str.charAt(i) - '0';
            if (integer >= 10 && integer <= 25) {
                dp[i] += (i - 2) >= 0 ? dp[i - 2] : 1;
            }
        }
        return dp[str.length() - 1];
    }
}
